//
//  DBClass.m
//  MooreDoll
//
//  Created by 郭景豪 on 2015/1/2.
//  Copyright (c) 2015年 Tank. All rights reserved.
//

#import "DBClass.h"


DBClass *dbClass;

static NSString * const DB_NAME            = @"MooreDoll";
static NSString * const DB_NAME_SQLITE     = @"MooreDoll.sqlite";

@implementation DBClass

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (id)init{
    //2生出自己 繼承自父類別NSObject
    self = [super init];
    //如果生出自己就 呼叫loadDB
    if (self) {
        
    }
    //把自己回傳出去
    return self;
}


+(DBClass *)sharedInstance
{
    if (dbClass == nil) {
        dbClass = [[DBClass alloc]init];
    }
    return dbClass;
}

/*
 
 Managed Object Model（管理數據模型）: 你可以將這個東西看作是數據庫的輪廓，或者結構。這裡包含了各個實體的定義信息，一般來說，你會使用我們剛剛看過的視覺編輯器來操作這個物體，添加屬性，建立屬性之間的關係等等，當然你也可以使用代碼。
 Persistent Store Coordinator （持久性數據協調器）： 你可以將這個東西看作是數據庫連接庫，在這裡，你將設置數據存儲的名字和位置，以及數據存儲的時機。
 Managed Object Context （管理數據內容）：你可以將這一部分看作是數據的實際內容，這也是整個數據庫中對我們而言最重要的部分（這還用說），基本上，插入數據，查詢數據，刪除數據的工作都在這裡完成。
 */

/**
 取得應用程式Documents目錄的子路徑.
 */
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager]
             URLsForDirectory:NSDocumentDirectory
             inDomains:NSUserDomainMask] lastObject];
}

/**
 傳回被初始化過的NSPersistentStoreCoordinator物件
 如果已經初始化過就直接傳回
 不然就開啟Documents下的iOS7.sqlite檔案
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator //取得檔案儲存協調器
{
    // 如果已經初始化就直接傳回
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }
    // 從Documents目錄下指定物件的路徑
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:DB_NAME_SQLITE];
    NSLog(@"%@",storeURL);
    
    NSError *error = nil;
    // 初始化並傳回
    _persistentStoreCoordinator =
    [[NSPersistentStoreCoordinator alloc]
     initWithManagedObjectModel: [self managedObjectModel]];
    if (![_persistentStoreCoordinator
          addPersistentStoreWithType:NSSQLiteStoreType
          configuration:nil
          URL:storeURL
          options:nil
          error:&error])
    {
        
        NSLog(@"在存取資料庫時發生不可預期的錯誤 %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}

/**
 從Data Model檔中建立NSManagedObjectModel物件
 如果已經建立會直接回傳而不用再次讀取
 */
- (NSManagedObjectModel *)managedObjectModel//取得物件模型
{
    //如果物件已經初始化過就直接回傳
    if (_managedObjectModel != nil)
    {
        return _managedObjectModel;
    }
    // 沒有的話就直接載入該檔案之後回傳
    // 在URLForResource中傳入書名
    NSURL *modelURL = [[NSBundle mainBundle]
                       URLForResource:DB_NAME withExtension:@"momd"];
    // 從Model檔案中實例化m_managedObjectModel
    _managedObjectModel = [[NSManagedObjectModel alloc]
                            initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

/**
 傳回這個應用程式的NSManagedObjectContext物件
 如果已經存在就直接回傳，不然就從sql-lite中
 藉由persistentStoreCoordinator中讀取
 */
- (NSManagedObjectContext *)managedObjectContext
{
    // 如果物件已經初始化就直接回傳
    if (_managedObjectContext != nil)
    {
        return _managedObjectContext;
    }
    // 不然就使用persistentStoreCoordinator從資料庫中讀取
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        _managedObjectContext =
        [[NSManagedObjectContext alloc] init];
        [_managedObjectContext
         setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

// 將資料儲存進managedObjectContext中
- (void)saveContext
{
    NSError *error = nil;
    // 取得NSManagedObjectContext物件
    NSManagedObjectContext *managedObjectContext =
    [self managedObjectContext];
    // 如果存在就進行儲存的動作
    if (managedObjectContext != nil)
    {
        // 如果資料有變更就進行儲存
        if ([managedObjectContext hasChanges] &&
            ![managedObjectContext save:&error])
        {
            // 資料儲存發生錯誤
            NSLog(@"Unresolved error %@, %@",
                  error, [error userInfo]);
            abort();
        }
    }
}








@end
